package cn.kivensoft.util;

public class Tuple {
	public static class T1<A1> {
		private A1 arg1;
		public T1(A1 arg1) {
			this.arg1 = arg1;
		}

		public A1 getArg1() {
			return arg1;
		}

		public void setArg1(A1 arg1) {
			this.arg1 = arg1;
		}
	}

	public static class T2<A1, A2> extends T1<A1> {
		private A2 arg2;

		public T2(A1 arg1, A2 arg2) {
			super(arg1);
			this.arg2 = arg2;
		}

		public A2 getArg2() {
			return arg2;
		}

		public void setArg2(A2 arg2) {
			this.arg2 = arg2;
		}
	}

	public static class T3<A1, A2, A3> extends T2<A1, A2> {
		private A3 arg3;

		public T3(A1 arg1, A2 arg2, A3 arg3) {
			super(arg1, arg2);
			this.arg3 = arg3;
		}

		public A3 getArg3() {
			return arg3;
		}

		public void setArg3(A3 arg3) {
			this.arg3 = arg3;
		}
	}

	public static class T4<A1, A2, A3, A4> extends T3<A1, A2, A3> {
		private A4 arg4;

		public T4(A1 arg1, A2 arg2, A3 arg3, A4 arg4) {
			super(arg1, arg2, arg3);
			this.arg4 = arg4;
		}

		public A4 getArg4() {
			return arg4;
		}

		public void setArg4(A4 arg4) {
			this.arg4 = arg4;
		}
	}

	public static class T5<A1, A2, A3, A4, A5> extends T4<A1, A2, A3, A4> {
		private A5 arg5;

		public T5(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5) {
			super(arg1, arg2, arg3, arg4);
			this.arg5 = arg5;
		}

		public A5 getArg5() {
			return arg5;
		}

		public void setArg5(A5 arg5) {
			this.arg5 = arg5;
		}
	}

	public static class T6<A1, A2, A3, A4, A5, A6> extends T5<A1, A2, A3, A4, A5> {
		private A6 arg6;

		public T6(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5, A6 arg6) {
			super(arg1, arg2, arg3, arg4, arg5);
			this.arg6 = arg6;
		}

		public A6 getArg6() {
			return arg6;
		}

		public void setArg6(A6 arg6) {
			this.arg6 = arg6;
		}
	}

	public static <A1> T1<A1> of(A1 arg1) {
		return new T1<>(arg1);
	}

	public static <A1, A2> T2<A1, A2> of(A1 arg1, A2 arg2) {
		return new T2<>(arg1, arg2);
	}

	public static <A1, A2, A3> T3<A1, A2, A3> of(A1 arg1, A2 arg2, A3 arg3) {
		return new T3<>(arg1, arg2, arg3);
	}

	public static <A1, A2, A3, A4> T4<A1, A2, A3, A4> of(A1 arg1, A2 arg2, A3 arg3, A4 arg4) {
		return new T4<>(arg1, arg2, arg3, arg4);
	}

	public static <A1, A2, A3, A4, A5> T5<A1, A2, A3, A4, A5> of(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5) {
		return new T5<>(arg1, arg2, arg3, arg4, arg5);
	}

	public static <A1, A2, A3, A4, A5, A6> T6<A1, A2, A3, A4, A5, A6> of(
			A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5, A6 arg6) {
		return new T6<>(arg1, arg2, arg3, arg4, arg5, arg6);
	}

}
